package bean;

import java.io.ByteArrayOutputStream;
import java.util.Date;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import webService.EnvioMensajeWebService;
import bean.remote.ConfiguracionRemote;
import bean.remote.MQSenderRemote;
import bean.remote.NotificadorLogisticaRemote;
import dominio.Configuracion;

@Stateless(name="notificadorLogisticaBean")
@Remote(NotificadorLogisticaRemote.class)
public class NotificadorLogisticaBean implements NotificadorLogisticaRemote {

	private final static Logger logger = Logger.getLogger(NotificadorLogisticaBean.class);
	
	@EJB(beanName="configuracionBean")
	private ConfiguracionRemote configuracionRemote;
	
	@EJB(beanName = "mqSenderBean")
	private MQSenderRemote mqSenderRemote;
	
	@Override
	public void notificar(String mensaje) {
		String xml = crearXML(mensaje);
		Configuracion configuracion = configuracionRemote.findByLogistica();
		if (configuracion.esSincronico()) {
			logger.info("Se envio el mensaje sincronico a logistica");
			new EnvioMensajeWebService().enviarMensaje(configuracion, xml);
		} else {
			mqSenderRemote.sendLogistica(configuracion, xml);
			logger.info("Se envio el mensaje por cola de mensajeri a logistica "
					+ configuracion);
		}
	}

	/**
	 * <log>
			<fecha>{FORMATO:YYYY-MM-DD hh:mm:ss}</fecha> 
			<idModulo></idModulo>
			<mensaje></mensaje>
		</log>

	 * @param mensaje
	 * @return
	 */
	
	public String crearXML(String mensaje) {
		String xmlFile = "";
		try {

			DocumentBuilderFactory docFactory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

			// root elements
			Document doc = docBuilder.newDocument();
			Element rootElement = doc.createElement("log");
			doc.appendChild(rootElement);

			// mensaje elements
			Element mensajeElement = doc.createElement("mensaje");
			mensajeElement.appendChild(doc.createTextNode(mensaje));
			rootElement.appendChild(mensajeElement);

			// fecha elements FORMATO:YYYY-MM-DD hh:mm:ss -->
			Element fechaElement = doc.createElement("fecha");
			Date fecha = new Date();
			java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String fechaString = sdf.format(fecha);
			fechaElement.appendChild(doc.createTextNode(fechaString));
			rootElement.appendChild(fechaElement);

			// idModulo elements
			Element idModulo = doc.createElement("idModulo");
			idModulo.appendChild(doc.createTextNode("11"));
			rootElement.appendChild(idModulo);

			TransformerFactory transformerFactory = TransformerFactory
					.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource source = new DOMSource(doc);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			StreamResult result = new StreamResult(baos);

			transformer.transform(source, result);
			System.out.println("File saved!");

			xmlFile = result.getOutputStream().toString();
		} catch (ParserConfigurationException pce) {
			pce.printStackTrace();
		} catch (TransformerException tfe) {
			tfe.printStackTrace();
		}

		return xmlFile;
	}
}
